home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Programmer Disk
/
The Programmer Disk (Microforum).iso
/
xpro
/
qb1
/
pro2
/
qb-db3.bas
< prev
next >
Wrap
BASIC Source File
|
1991-04-23
|
5KB
|
154 lines
'--------------------------------------------------------------------
' Create a dBASE III File from QB45 Dapro
'
' Dennis Gellert 23 April 1991
'
' This QB45/QBX demo program creates a dBASE III compatible file
' called TESTMAKE.DBF. The file includes 1 Record. (Note, for a
' dBASE file, the header, etc must be structured correctly, or
' dBASE will refuse to open as a valid dBASE File).
'
' To change this program to create a dBASE III file with the field
' data structure you require:
' (1) Change the Data statements at the end to reflect new structure
' (2) Change the TYPE block "FldDataSpec" to follow above.
' (3) Change the code within the area labelled: "Records Go Here".
'
' To edit an existing dBASE file, read the existing Header instead
' of writing. You may then calc the offset of the Records/Fields you
' wish to Edit/Append.
'---------------------------------------------------------------------
CLS
PRINT "Create dBASE III Data File"
PRINT "--------------------------"
'
'--- dBaseIII file header, 32 bytes ---
'Do not change!
'
TYPE dBHeader
Version AS STRING * 1
Lastupdate AS STRING * 3
NumRecs AS LONG
NumbytesHeader AS INTEGER
NumBytesRec AS INTEGER
Trash AS STRING * 20
END TYPE
'--- Field Descriptions ---
'Do not change!
'
TYPE FieldDescriptor '32 bytes * Number of Fields (up to 128)
FName AS STRING * 11
FType AS STRING * 1
DataAddress AS STRING * 4
Length AS STRING * 1
DecimalCount AS STRING * 1
Trash AS STRING * 14
END TYPE
'--- Actual data written for this file ---
'This structure should follow the data structure specified
'for the dBASE file. Edit to Suit.
'
TYPE FldDataSpec
DELETED AS STRING * 1
CHRISTIAN AS STRING * 15
SURNAME AS STRING * 15
AGE AS STRING * 3
DOLLARS AS STRING * 6
END TYPE
'--- Creating variables for user-defined types ---
DIM header AS dBHeader
DIM FieldDes AS FieldDescriptor
DIM FldData AS FldDataSpec
'
'--- This will be dBASE III File ---
OPEN "TESTMAKE.DBF" FOR BINARY AS #1
'
'--------------- Create & Write dBASE III Header -----------------
READ tfields% 'Total Fields to process
header.Version = CHR$(&H3) 'dBASE III, no memo file
'
MID$(header.Lastupdate, 1, 1) = CHR$(VAL(RIGHT$(DATE$, 2)))
MID$(header.Lastupdate, 2, 1) = CHR$(VAL(LEFT$(DATE$, 2)))
MID$(header.Lastupdate, 3, 1) = CHR$(VAL(MID$(DATE$, 4, 2)))
'
header.NumRecs = 0
'
NumFields% = tfields%
'
'Number of bytes in Header = 32 start +32 for each field +1 for terminator
header.NumbytesHeader = 32 + (NumFields% * 32) + 1
'
'--- Read through data to calc length of Record (+1 for delete flag) ---
RecLength% = 1
FOR fldnum% = 1 TO tfields%
READ AFName$, AFType$, AL%, ADC%
RecLength% = RecLength% + AL%
NEXT fldnum%
'
header.NumBytesRec = RecLength%
header.Trash = STRING$(20, 0) 'Unused here
'
PUT #1, , header 'Save the Header start
'
'-------------- Field Descriptions ----------------
nf$ = STRING$(11, 0)
'
FieldDes.DataAddress = STRING$(4, 0) 'Unused in File, set in memory
FieldDes.Trash = STRING$(14, 0) 'Unused here
'
RESTORE flddes
FOR fldnum% = 1 TO tfields%
'Field Names are padded with nulls, and must be in Upper case
READ AFName$: FieldDes.FName = UCASE$(LEFT$(AFName$ + nf$, 11))
READ AFType$: FieldDes.FType = UCASE$(AFType$)
READ AL%: FieldDes.Length = CHR$(AL%)
READ ADC%: FieldDes.DecimalCount = CHR$(ADC%)
PUT #1, ((fldnum% * 32) + 1), FieldDes
NEXT fldnum%
'
FldTerm$ = CHR$(&HD)
PUT #1, , FldTerm$
'------------------------------------------------
'
'--- Records Go Here. Edit to Suit. ---
'DO
'Include the loop if appending a number of records
FldData.DELETED = CHR$(32) 'SPACE for NOT deleted flag (* =deleted)
FldData.CHRISTIAN = "Robert"
FldData.SURNAME = "Hawke"
RSET FldData.AGE = "55" 'dBASE III Right justifies numbers
RSET FldData.DOLLARS = "23.45"
PUT #1, , FldData
header.NumRecs = header.NumRecs + 1 'Increment for each Record
'LOOP until all records are processed
'
'------------------------------------------------
'--- End of File marker appended to the end ---
EOFMarker$ = CHR$(&H1A)
PUT #1, , EOFMarker$
'
'--- Go back to header and write number of Records written to file ---
' and finish up the program.
PUT #1, 5, header.NumRecs
CLOSE #1
PRINT
PRINT "Complete."
END
'
'--- Data Statements specify dBASE III file data structure ---
' Edit to Suit.
'
DATA 4 : 'tfields Total number of Fields in a Record
'
flddes: 'Field Name, Data Type, Length, Decimal
DATA CHRISTIAN,C,15,0 : 'Field 1
DATA SURNAME,C,15,0 : 'Field 2
DATA AGE,N,3,0 : 'Field 3
DATA DOLLARS,N,6,2 : 'Field 4